var Memcached = require('memcached')
var Sync = require('./sync')

// var mem = new Memcached(sysConf.memcached.host)
var mem = new Memcached("localhost:11211")


var _keysArr = [];
var _map = {};

var monit = module.exports = {};
// var sysConf = global.sysConfig;
// console.log(sync)

var sync = new Sync()
sync.add(itemsFunc).add(cachedump).add(keyValues);

monit.all = function (callback){
	// .add(itemsFunc)
	// .add(cachedump)
	// .add(keyValues)
	sync.done(function (){
		// for(var pre in this.self){
		// 	if(pre.indexOf("_") > -1){
		// 		this.self[pre] = undefined;
		// 	}
		// }
		// callback.call(this.self, this.self)
		callback.call(this, this)
	})
}


function itemsFunc(next){
	var indexArr = [], items = {}, self = this;
	mem.items(function (err, datas){
		datas = Array.isArray(datas)? datas[0] : datas;
		for(var index in datas){
			index = parseInt(index) || index;
			if(typeof index != 'number'){
				continue;
			}
			indexArr.push(index)
		}
		items.ids = indexArr;
		items.datas = datas
		self.self._memcahedItems = items;
		if(typeof next == 'function')
			next()
	})
}

function cachedump(next){
	var self = this,
		ids = this.self._memcahedItems.ids;
	for (var i = 0; i < ids.length; i++) {
		var last = false;
		if(i == (ids.length - 1)){
			last = true;
		}
		mem.cachedump("localhost:11211", ids[i], 0, function (id, last, err, datas){
			if(err){
				return;
			}
			if(datas){
				datas.cachedumpKeys = datas.cachedumpKeys || {}
			}
			var _ikeys = [];
			if(Array.isArray(datas)){
				for(var i = 0; i < datas.length; i++){
					_keysArr.push(datas[i].key)
					_ikeys.push(datas[i].key)
				}
			} else {
				_keysArr.push(datas.key)
				_ikeys.push(datas.key)
			}
			datas.cachedumpKeys[id] = _keysArr;
			datas.ikeys = _ikeys;
			if(last){
				datas.keys = _keysArr;
				self.self._itemDatas = datas;
				if(typeof next == 'function')
					next()
			}
		}.bind(this, ids[i], last))
	}
}

function keyValues(next){
	// console.log(this.self)
	// console.log(this.self.datas.keys)
	var self = this.self,
		_itemDatas = self._itemDatas;
		_keys = _itemDatas.keys;
	for(var i = 0; i < _keys.length; i++){
		var last = ((i + 1) == _keys.length)? true : false;
		mem.get(_keys[i], function (k, last, err, value){
			_map[k] = value;
			if(last){
				self.sessionDatas = _map;
				if(typeof next == 'function')
					next()
			}
		}.bind(this, _keys[i], last))
	}
}

















// function getKey (err, datas){
// 	// mem.cachedump("localhost:11211", id, 0, function (err, datas){
// 	if(Array.isArray(datas)){
// 		for(var i = 0; i < datas.length; i++){
// 			_keysArr.push(datas[i].key)
// 		}
// 	} else {
// 		_keysArr.push(datas.key)
// 	}
// 	if(typeof next == 'function'){
// 		next()
// 	}
// 	// })
// }
// var test = function (){
// 	var indexArr = [], items = {}, 
// 		getKeyFuncs = [];
// 	mem.items(function (err, datas){
// 		datas = Array.isArray(datas)? datas[0] : datas;
// 		for(var index in datas){
// 			index = parseInt(index) || index;
// 			if(typeof index != 'number'){
// 				continue;
// 			}
// 			getKey.bind(this, index);
// 			indexArr.push(index)
// 			getKeyFuncs.push(getKey)
// 		}
// 		for(var i = 0; i < getKeyFuncs.length; i++){
// 			if(i != getKeyFuncs.length + 1){
// 				getKeyFuncs[i]()
// 			}
// 		}
// 	})
// }



// var items = function (callback){
// 	var indexArr = [], items = {};
// 	mem.items(function (err, datas){
// 		datas = Array.isArray(datas)? datas[0] : datas;
// 		for(var index in datas){
// 			index = parseInt(index) || index;
// 			if(typeof index != 'number'){
// 				continue;
// 			}
// 			indexArr.push(index)
// 		}
// 		items.ids = indexArr;
// 		items.datas = datas
// 		callback.call(items, items);
// 	})
// }, cachedump = function (ids, callback){
// 	for (var i = 0; i < ids.length; i++) {
// 		var last = false;
// 		if(i == (ids.length - 1)){
// 			last = true;
// 		}
// 		mem.cachedump("localhost:11211", ids[i], 0, function (id, last, err, datas){
// 			if(err){
// 				return;
// 			}
// 			if(datas){
// 				datas.cachedumpKeys = datas.cachedumpKeys || {}
// 			}
// 			var _ikeys = [];
// 			if(Array.isArray(datas)){
// 				for(var i = 0; i < datas.length; i++){
// 					_keysArr.push(datas[i].key)
// 					_ikeys.push(datas[i].key)
// 				}
// 			} else {
// 				_keysArr.push(datas.key)
// 				_ikeys.push(datas.key)
// 			}
// 			datas.cachedumpKeys[id] = _keysArr;
// 			datas.ikeys = _ikeys;
// 			if(last){
// 				datas.keys = _keysArr;
// 				callback.call(datas, datas);
// 			}
// 		}.bind(this, ids[i], last))
// 	}
// }, keys = function (callback){
// 	var allkeys = []
// 	items(function (items){
// 		var ids = items.ids;
// 		cachedump(ids, function (datas){
// 			callback.call(datas, datas.keys)
// 		})
// 	})
// }, keyValues = function (prefix, callback){
// 	keys(function (_keys){
// 		for(var i = 0; i < _keys.length; i++){
// 			var last = ((i + 1) == _keys.length)? true : false;
// 			if(typeof prefix == 'function'){
// 				callback = prefix;
// 			} else if(typeof prefix == 'string' && (_keys[i].indexOf(prefix) < 0)){
// 				continue;
// 			}
// 			mem.get(_keys[i], function (k, last, err, value){
// 				map[k] = value;
// 				console.log(map)
// 				if(last){
// 					callback.call(map, map)
// 				}
// 			}.bind(this, _keys[i], last))
// 		}
// 	})
// }

// keyValues("ult_sess_", function (data){
// 	console.log("----------------------------")
// 	console.log(map)
// })

// monit.items = function (callback){
	// mem.items(function (err, item){
	// 	var indexArr = [], keyArr = [], res = {};
	// 	item = Array.isArray(item)? item[0] : item;
	// 	for(var index in item){
	// 		index = parseInt(index) || 0;
	// 		if(typeof index != 'number'){
	// 			continue;
	// 		}
	// 		indexArr.push(index)
	// 		mem.cachedump(sysConf.memcached.host, index, 0, function (idx, err, data){
	// 			res.cachedumpErr = res.cachedumpErr || {}
	// 			res.getKeyErr = res.getKeyErr || {}
	// 			res.datas = res.datas || {}
	// 			if(err){
	// 				res.cachedumpErr[idx] = JSON.stringify(err);
	// 			}
	// 			if(Array.isArray(data)){
	// 				for(var i = 0; i < data.length; i++){
	// 					keyArr.push(data[i].key)
	// 					// mem.get(data[i].key, function (k, err, value){
	// 					// 	if(err){
	// 					// 		res.getKeyErr[k] = JSON.stringify(err);
	// 					// 	}
	// 					// 	res.datas[k] = value
	// 					// }.bind(this, data[i].key))
	// 				}
	// 			} else if(data.key){
	// 				keyArr.push(data.key)
	// 				// mem.get(data.key, function (k, err, value){
	// 				// 	if(err){
	// 				// 		res.getKeyErr[k] = JSON.stringify(err);
	// 				// 	}
	// 				// 	res.datas[k] = value
	// 				// }.bind(this, data.key))
	// 			}

	// 			// var obj = {
	// 			// 	cachedumpErr: err,
	// 			// 	keys: indexArr,
	// 			// 	datas: datas
	// 			// };
	// 			// callback.call(obj, datas);
	// 		}.bind(this, index))
	// 	}
	// })
// }